package com.chaopei.xmljson_parse;

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author adai
 * @date 2019年5月11日
 */
public class DomParse {
	// 通过dom解析xml文件
	public static void go() {
		////路径一,路径要注意
		String path1=System.getProperty("user.dir")+"\\src";
		System.out.println(path1);
		////路径二,也行啊
		String path2= DomParse.class.getResource("/").getPath();
		System.out.println(path2);
		// 1.创建文档构建工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			// 创建文档构建对象
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 创建文档对象,默认到项目的根下找
			//Document dc = db.parse("books.xml");
			Document dc = db.parse(path1+"/books.xml");
			// 获取所有book节点的集合
			NodeList books = dc.getElementsByTagName("book");
			// 获取books的长度,然后去遍历
			int lg = books.getLength();
			System.out.println("books的长度为:" + lg);
			System.out.println("=====遍历所有节点book及其属性值=====");
			for (int i = 0; i < lg; i++) {
				Node book = books.item(i);
				////获取每个book节点属性节点的集合
				NamedNodeMap attrs = book.getAttributes();
				////接下来继续遍历属性名与属性值
				for (int j = 0; j < attrs.getLength(); j++) {
					Node attr = attrs.item(j);
					System.out.print("**属性名:" + attr.getNodeName() + " 值:" + attr.getNodeValue());
				}
				System.out.println();
				//// 遍历每个book节点的子节点////
				NodeList childs = book.getChildNodes();
				for (int m = 0; m < childs.getLength(); m++) {
					// 区分子节点中text类型的子节点,还是elements类型的子节点;可能book中直接有字符
					if (childs.item(m).getNodeType() == Node.ELEMENT_NODE) {
						System.out.print("子节点:" + childs.item(m).getNodeName());
						System.out.println(" 值为:" + childs.item(m).getFirstChild().getNodeValue());
					} else if (!childs.item(m).getNodeValue().trim().equals("")) {// 不打印空行
						// 去掉前后的空格再输出ok!!!
						System.out.println(childs.item(m).getNodeValue().trim());
					}
				}
			} // for
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
